#include "window.h"
#include "ui_window.h"
//#include "glsprites.h"
#include "cmenustate.h"
#include "cgamestate.h"

#include <QTimer>
#include <QKeyEvent>
#include <QTime>

window::window(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::window)
{
    ui->setupUi(this);

    gl = new CStateManager();    // sukuriamas GLWidget objektas

    // INICIJUOJAM VISUS STATE'us (nustatom jiems nuorodas į juos valdančią klasę)
    gl->st_add(CMenuState::instance());
    gl->st_add(CGameState::instance());
    CMenuState::instance()->init(gl);
    CGameState::instance()->init(gl);
    gl->setState(CMenuState::instance());       // pirmasis state

    // gl patalpinimas per visą ekraną
    this->setLayout(ui->verticalLayout);
    ui->verticalLayout->addWidget(gl);

    // sukuriamas laikmatis, sukonfiguruoji signalai ir slotai
    timer = new QTimer(this);
    connect( timer, SIGNAL(timeout()), this, SLOT(frame()) );
    timer->start(0);
}

window::~window()
{
    delete ui;
    delete gl;
    delete timer;
}

void window::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

// siunčia key eventą gl objektui
void window::keyPressEvent(QKeyEvent *e)
{
    gl->handleKeys( e, true );
}

// siunčia key eventą gl objektui
void window::keyReleaseEvent(QKeyEvent *e)
{
    gl->handleKeys( e, false );
}

// kadro metodas, čia kviečiami metodai kurie turi vykti kiekvieną kadrą
void window::frame()
{
    timer->stop();
    static QTime time;      // laikas naudojamas nustatyti kadro laiką
    time = QTime::currentTime();

    gl->handleControls();   // tikrinamas valdymas

    int r = gl->doLogic();  // čia vygdoma fizika

    gl->updateGL();     // renderinamas GL vaizdas

    if ( r != -1) {
        int ms = time.msecsTo( QTime::currentTime() );  // suskaičiuojama kiek laiko užtruko kadro generaviams
        timer->start((16>ms)?16-ms:0);                  // jei laiko liko, galima ir pamiegoti
    } else {
        QApplication::exit();   // nutraukiamas programos vykdymas
    }
}
